<?php

/**
 * Contacto filter form.
 *
 * @package    Sanitas
 * @subpackage filter
 * @author     Jose Antonio Sánchez Bedoya
 * @version    SVN: $Id: sfDoctrineFormFilterTemplate.php 23810 2009-11-12 11:07:44Z Kris.Wallsmith $
 */
class ContactoFormFilter extends BaseContactoFormFilter
{
    // Variable para controlar cuando utilizo el autocomplete para el nombre y cuando no
    protected $con_id = false;


  public function configure()
  {
      $this->disableLocalCSRFProtection();
      //following code will remove fields from form
      unset($this->widgetSchema['created_at']);
      unset($this->widgetSchema['updated_at']);
      unset($this->widgetSchema['validated_at']);
      unset($this->widgetSchema['is_validated']);
      unset($this->widgetSchema['removed_at']);
      unset($this->widgetSchema['remove_it']);
      
      // Para añadir el nombre del cliente_id          
      $this->validatorSchema->setOption('allow_extra_fields', true);
      $this->setWidget('id',new sfWidgetFormFilterInput(array('with_empty' => false)));
      $this->setWidget('cliente_nombre', new sfWidgetFormInputText(array(), array('class' => 'lectura', 'size'=>'35px')));
      //$this->setWidget('cliente_nombre', new sfWidgetFormFilterInput(array('with_empty' => false)));
      //$this->setWidget('cliente_municipio', new sfWidgetFormFilterInput(array('with_empty' => false)));
      
      $idiomas = sfconfig::get('app_idiomas_list');
      array_unshift($idiomas, "");
      $this->setWidget('idioma', new sfWidgetFormChoice(array(
                                            'choices' => $idiomas,                                            
                                      )));
      
      $estados = sfconfig::get('app_estados_list');
      array_unshift($estados, "");      
      $this->setWidget('estado', new sfWidgetFormChoice(array(
                                            'choices'  => $estados,                                     
                                      )));       
      
      $this->setWidget('telefono', new sfWidgetFormFilterInput(array('with_empty' => false)));
      $this->setWidget('municipio', new sfWidgetFormFilterInput(array('with_empty' => false)));
      
      // Rango de fechas para fecha_nacimiento
      $min_año = sfconfig::get('app_rango_año_min');
      $max_año = sfconfig::get('app_rango_año_max');
      $years = range($min_año, $max_año);
        
      $from_date = new sfWidgetFormDate(array('years' => array_combine($years, $years),
                                        'format' => '%day% - %month% - %year%'));      
      $to_date = new sfWidgetFormDate(array('years' => array_combine($years, $years),
                                        'format' => '%day% - %month% - %year%'));
      $this->widgetSchema['fecha_nac'] = new sfWidgetFormFilterDate(array(
  			'from_date' => $from_date, 
  			'to_date' => $to_date, 
  			'with_empty' => false,
  	));
      
      
      // Definicion de Validadores para campos que no están en la BD
      $this->setValidator('id', new sfValidatorPass(array('required' => false)));
      $this->setValidator('cliente_nombre', new sfValidatorPass(array('required' => false)));
      $this->setValidator('cliente_municipio', new sfValidatorPass(array('required' => false)));      
      $this->setValidator('estado', new sfValidatorPass(array('required' => false)));      
      
  }
  
  // Para que funcione el filtro con campos select
  // Si no cuando no escribo nada en el campo Idioma, busca los que no tienen ninguno.  
  public function convertIdiomaValue($value)
  {
    return $value != '0' ? $value : false;   
  }
  
  public function addIdiomaColumnQuery(Doctrine_Query $query, $field, $value)
  { // Si he marcado sinidioma busco que idioma sea NULL
    if ($value == 'sinidioma') {                
        $query->addWhere('r.idioma IS NULL OR r.idioma LIKE 0');         
    } 
    else { // Si no busco por el idioma
        $query->addWhere('r.idioma = ?', $value);         
    }   
  }
  
  // Para que funcione el filtro con campos select
  // Si no cuando no escribo nada en el campo Estado, busca los que no tienen ninguno.     
  public function convertEstadoValue($value)
  {
    return $value != '0' ? $value : false;   
  }
  
  public function addEstadoColumnQuery(Doctrine_Query $query, $field, $value)
  { 
        if ($value == 'baja') {                
            $query->andWhere('r.polizasBajas = r.polizasTotales');         
        } elseif ($value == "alta"){
            $query->addWhere('r.polizasTotales > r.polizasBajas');
        }    
  }
  
  public function addIdColumnQuery(Doctrine_Query $query, $field, $values)
  { // Si he rellenado el autocomplete, busco el contacto por su id y cambio la variable con_id a true   
    if ($values['text'] != '') {        
        $q = $values['text'];
        $query->andWhere('r.id = ?', $q); 
        $this->con_id = true;
    }    
  }
 
  public function addClienteNombreColumnQuery(Doctrine_Query $query, $field, $values)
  {
    if (!is_array($values))
    {
      $values = array($values);
    }

    if (!count($values))
    {
      return;
    }
    // Si el nombre no lo he creado con autocomplete, lo busco por nombre o apellido
    // Si el id está relleno, lo buscaré por id y por tanto no crearé la sentencia SQL para el nombre y apellidos.
    if (!$this->con_id){
        $q = "%" . $values[0] . "%";
        $query->andWhere('r.nombre LIKE ? OR r.primer_apellido LIKE ? OR r.segundo_apellido LIKE ?', array($q, $q, $q));
    }    
  }
  
  /*
   * Hay que copiar este método de BaseContactoFormFilter y cambiar idioma a ForeignKey para
   * que lo coja con un select en los filtros aplicados.
   */
  public function getFields()
  {
    return array(
      'id'               => 'Text',
      'nombre'           => 'Text',
      'primer_apellido'  => 'Text',
      'segundo_apellido' => 'Text',
      'num_documento'    => 'Text',
      'telefono'         => 'Text',
      'tipo_via'         => 'Text',
      'direccion'        => 'Text',
      'num_via'          => 'Number',
      'resto_via'        => 'Text',
      'piso'             => 'Number',
      'puerta'           => 'Text',
      'escalera'         => 'Text',
      'portal'           => 'Text',
      'municipio'        => 'Text',
      'cod_postal'       => 'Number',
      'provincia'        => 'Text',
      'email'            => 'Text',
      'fecha_nac'        => 'Date',
      'sexo'             => 'Text',
      'idioma'           => 'ForeignKey',      
      'created_at'       => 'Date',
      'updated_at'       => 'Date',
      'validated_at'     => 'Date',
      'is_validated'     => 'Boolean',
      'removed_at'       => 'Date',
      'remove_it'        => 'Boolean',
      'users_list'       => 'ManyKey',
      'polizas_list'     => 'ManyKey',
      'grupos_list'      => 'ManyKey',
      'my_users_list'    => 'ManyKey',
      'estado'           => 'Text',         //Añado este campo aunque no está en la BD, porque quiero filtrar por él.
      'polizasTotales'   => 'Number',
      'polizasBajas'   => 'Number'
    );
  }
}
